/**********************************************************************************
 * 这个文件应该用于用户中心的投票页面
 * ********************************************************************************/
import { get, post } from '@/axios/http'
import axios from "axios";
import {footContract, governancePoolContract, MANAGE_BASEURL, voteGovernanceContract} from "@/views/manage/js/manage.lib";
import {
	doCallback,
	trigerConstantContract,
	trigerSmartContract,
} from "@/libs/tron.lib";
import { MOCK } from "@/views/manage/js/manage.lib";
import {delOutTheNoise, encodeParams, hexToUtf8, stringInterceptLimit} from "@/libs/site.utils";


//todo 以下区块链方法评定是否可以复用
///////////////////////////////////////////////////   以下是区块链方法  ////////////////////////////////////////////////////////////
///////////////////////////////////////////////////   以下是区块链方法  ////////////////////////////////////////////////////////////
///////////////////////////////////////////////////   以下是区块链方法  ////////////////////////////////////////////////////////////

/**
 * 从区块链读取投票关键数据，以用于解析
 * @param ids 投票id，应该是一个数组
 * @param sender
 * @returns {Promise<unknown>}
 */
export function tronGetVoteKeyData(ids, sender) {
	const parameter = [
		{type: 'uint256[]', value: ids},
	];
	return new Promise(function (resolve, reject) {
		// console.log('读取投票信息: ', voteGovernanceContract, ids);
		trigerConstantContract(voteGovernanceContract, "viewProposalInfo(uint256[])", parameter, sender, (rs) => {
			resolve(rs);
		});
	})
}

/**
 * 读取投票的复审信息
 * @param ids
 * @param sender
 * @returns {Promise<unknown>}
 */
export function tronGetReviewInfo(ids, sender) {
	const parameter = [
		{type: 'uint256', value: ids},
	];
	return new Promise(function (resolve, reject) {
		// console.log('读取投票的复审信息: ', voteGovernanceContract, ids);
		trigerConstantContract(voteGovernanceContract, "getReviewInfo(uint256)", parameter, sender, (rs) => {
			resolve(rs);
		});

	})
}

/**
 * todo 合约抽离为参数
 * 计算足球每项盈亏信息
 * @param id
 * @param ids
 * @param sender
 * @returns {Promise<unknown>}
 */
export function tronGameIncomeCalculationList(id, ids, sender) {
	const parameter = [
		{type: 'uint256', value: id},
		{type: 'uint256[]', value: ids},
	];
	return new Promise(function (resolve, reject) {
		// console.log('读取投票的收益信息: ', voteGovernanceContract, parameter);
		trigerConstantContract(footContract, "gameIncomeCalculationList(uint256,uint256[])", parameter, sender, (rs) => {
			resolve(rs);
		});

	})
}


/**
 * todo 合约抽离为参数
 * 读取合约的资金基础资金数据，以用于解析
 * 这他妈什么JB翻译
 * @param ids
 * @param sender
 * @returns {Promise<unknown>}
 */
export function tronViewGamePlayMethodExpand(ids, sender) {
	const parameter = [
		{type: 'uint256', value: ids},
	];
	return new Promise(function (resolve, reject) {
		trigerConstantContract(footContract, "viewGamePlayMethodExpand(uint256)", parameter, sender, (rs) => {
			resolve(rs);
		});

	})
}


/**
 * 读取我的票数余额 [按任务流程，投票看成是存钱，领取时票都取光表示已经领完了，合约无法发放奖励]
 * @param user 要查看哪个用户的数据，其实就是自己
 * @param id
 * @param sender
 * @returns {Promise<unknown>}
 */
export function tronBalanceOfVotes(user, id, sender) {
	const parameter = [
		{type: 'address', value: user},
		{type: 'uint256', value: id},
	];
	return new Promise(function (resolve, reject) {
		trigerConstantContract(governancePoolContract, "lockTo(address,uint256)", parameter, sender, (rs) => {
			resolve(rs);
		})
	})
}


/**
 * 查看发起投票需质押的票数
 * @param sender
 * @returns {Promise<unknown>}
 */
export function tronProposalThreshold(sender) {
	let func = "proposalThreshold()";
	let parameters = [];
	return new Promise((resolve, reject)=> {
		trigerConstantContract(voteGovernanceContract, func, parameters, sender, (res) => {
			resolve(res)
		});
	})
	
}

/**
 * 授权额度查询 tron.lib里面有了
 * @param token 要查询的币种
 * @param gameContract 游戏合约
 * @param sender
 * @param cb
 */
// export function allowance(token, gameContract, sender, cb) {
// 	let parameters = [{
// 		type: 'address',
// 		value: sender
// 	}, {
// 		type: 'address',
// 		value: gameContract
// 	}];
// 	let func = "allowance(address,address)";
// 	trigerConstantContract(token, func, parameters, sender, (res) => {
// 		cb(res);
// 	});
// }

/**
 * 批量查询余额,其实就是返回授权额度，用这个值来判断，没有授权过就是0
 * @param contract
 * @param token
 * @param sender
 * @returns {Promise<unknown>}
 */
export function tronBalanceOfList(contract, tokens, sender) {
	let parameters = [{
		type: 'address',
		value: sender
	}, {
		type: 'address[]',
		value: tokens
	}];
	let func = "balanceOfList(address,address[])";
	return new Promise((resolve, reject)=> {
		trigerConstantContract(contract, func, parameters, sender, (res) => {
			resolve(res);
		});
	})
	
}


/**
 * 授权额度批量查询,这个是合约中自定义的方法，注意，以下有数组的参数，则是一对一关系
 * @param contract 这个方法所在的合约
 * @param tokens 要查询的币种余额的token数组
 * @param contracts 要查询是否有授权对应币的合约地址（某个合约操作某个币，要先授权）
 * @param targetUser 要查询的用户，支持多个，是一个数组，与币种下标相对应
 * @param sender 触发用户
 * @param cb
 */
export function tronAllowanceList(contract, tokens, contracts, targetUser, sender, cb) {
	let parameters = [{
		type: 'address[]',
		value: tokens
	}, {
		type: 'address[]',
		value: targetUser
	}, {
		type: 'address[]',
		value: contracts
	}];
	console.log('批量查询授权', parameters)
	//[xg,usdt] [游戏合约,游戏合约,游戏合约] [用户地址,用户地址]
	let func = "allowanceList(address[],address[],address[])";
	trigerConstantContract(contract, func, parameters, sender, (res) => {
		cb(res);
	});
}


/**
 * 创建投票,可以所有游戏共用
 * @param sender
 * @param vote_end_timep 投票结束时间
 * @param calladd
 * @param data
 * @param callback
 * @param confirmCallback
 */
export function tronCreateVote(sender, vote_end_timep, gaemContract, data, callback, confirmCallback) {
	let parameters = [{
		type: "uint256",
		value: vote_end_timep
	}, {
		type: "address",
		value: gaemContract
	}, {
		type: "bytes",
		value: data
	}];
	let func = "createProposal(uint256,address,bytes)";
	trigerSmartContract(voteGovernanceContract, func, parameters, sender, callback, confirmCallback);
}

/**
 * 取回票数和奖励(链上自动判断是否身份，进行对应的领取)
 * @param sender
 * @param proposalId
 * @param callback
 * @param confirmCallback
 */
export function tronGetBenefitsVote(sender, proposalId, callback, confirmCallback) {
	let parameters = [{
		type: "uint256",
		value: proposalId
	}];
	let paramConcat = "0x" + encodeParams(parameters);

	let func = "getBenefits(bytes)";
	trigerSmartContract(voteGovernanceContract, func, [{ type: "bytes", value: paramConcat }], sender, callback, confirmCallback);
}

/**
 * 作废投票
 * @param sender
 * @param proposalId
 * @param callback
 * @param confirmCallback
 */
export function tronDiscardProposal(sender, proposalId, callback, confirmCallback) {
	let parameters = [{
		type: "uint256",
		value: proposalId
	}];
	let param = encodeParams(parameters);
	let addParameters = "0x" + param;

	let func = "discardProposal(bytes)";
	trigerSmartContract(voteGovernanceContract, func, [{
		type: "bytes",
		value: addParameters
	}], sender, callback, confirmCallback);
}


/**
 * 查看可以拿到的金额(质押、收益、本金，这里发起人，参与人共用)
 * @param sender
 * @param address
 * @param proposalId
 * @param callback
 * @param confirmCallback
 */
export function tronVotingIncomeAmount(sender, address, proposalId, callback, confirmCallback) {
	let parameters = [{
		type: "address",
		value: address
	}, {
		type: "uint256",
		value: proposalId
	}];
	let func = "votingIncomeAmount(address,uint256)";
	trigerConstantContract(voteGovernanceContract, func, parameters, sender, (res) => {
		callback(res);
	});
}


/**
 * 投票发起人填写赛事结果,这里的结果是写入投票对象中，审核后再写入游戏中
 * @param proposalId
 * @param contract
 * @param match_results //结果,应该是一个数组 ** 使用bytes更有兼容性
 * @param remark
 * @param sender
 * @param callback
 * @param confirmCallback
 */
export function userEndsGameCheck(proposalId, contract, match_results, remark, sender, callback, confirmCallback) {
	let parameters = [{
		type: 'uint256',
		value: proposalId //投票对象
	}, {
		type: 'address',
		value: contract
	}, {
		type: 'bytes',
		value: match_results
	}, {
		type: 'string',
		value: remark //备注。提交结果是结果，补充信息读取开
	}];
	let func = "userEndsGameCheck(uint256,address,bytes,string)";
	trigerSmartContract(voteGovernanceContract, func, parameters, sender, callback, confirmCallback);
}


/**
 * 币种解析，读取这个合约的符号，名称，精度
 * @param address 要查询的币种
 * @param sender
 * @param callback
 */
export function tronTokenAnalyze(address, sender, callback=()=>{}) {
	
	let parameters = [{
		type: "address",
		value: address
	}];
	let func = "addressInfo(address)";
	trigerConstantContract(governancePoolContract, func, parameters, sender, (rs) => {
		console.log('正在检测精度...',address,sender)
		//如果长度不足，判定是返回16进制抽风，不做处理
		if (rs.length < 10) return false
		
		//截取符号
		let symbol = stringInterceptLimit(rs, 3, 68);
		symbol = hexToUtf8(symbol);
		
		
		//截取名称
		let name = stringInterceptLimit(rs, 5, 68);
		name = hexToUtf8(name);
		
		
		//截取精度
		let decimal = delOutTheNoise(stringInterceptLimit(rs, 2, 68));
		decimal = tronWeb.toBigNumber(decimal).c[0];
	
		
		let o = {"decimal": decimal, "name": name, "symbol": symbol, "address": address};
		callback(o)
	});
	
}


///////////////////////////////////////////////////   以下是异步api  ////////////////////////////////////////////////////////////
///////////////////////////////////////////////////   以下是异步api  ////////////////////////////////////////////////////////////
///////////////////////////////////////////////////   以下是异步api  ////////////////////////////////////////////////////////////
/**
 * 发送请求给服务器：根据hash值解析相关数据
 * @param data
 * @param hash
 * @param cb
 */
export function apiVotingAnalysisServe(data, hash, cb) {
	let _prefix = !MOCK ? 'VotingBlockServlet?act=' : ''
	axios({
		url: MANAGE_BASEURL+_prefix,
		method: 'post',
		headers: {},
		data: { "act": "votingAnalysis", "hash": hash, "data": data, "type": 1 }
	}).then((res) => {
		cb(res)
	}).catch((res) => {
		cb(res)
	})
}

//todo 待整改
/**
 * 通知服务器根据hasn值拉取新数据并解析
 * @param data
 * @param hash
 * @param cb
 */
export function footballAnalysisServe(data, hash, cb) {
	let _prefix = !MOCK ? 'VotingBlockServlet?act=' : ''
	axios({
		url: MANAGE_BASEURL+_prefix,
		method: 'post',
		headers: {},
		data: { "act": "footballAnalysis", "hash": hash, "data": data, "type": 1 }
	}).then((res) => {
		cb(res)
	}).catch((res) => {
		cb(res)
	})
}


//创建赛事时，解析使用的币种，把这个信息保存到服务器，用于前端显示
export function apiStorageCurrency (param, callback=()=>{}) {
	//todo 注意这个servlet ,应该另起一个,不要放football里
	let _prefix = !MOCK ? 'FootballLotteryServlet?act=' : ''
	get(MANAGE_BASEURL + _prefix + 'storageCurrency',param).then((res)=>{
	    callback(res)
	})
}

//超级用户列表
export function apiSuperUserList (param, callback) {
	let _prefix = !MOCK ? 'VotingPreEntryServlet?act=' : ''
	get(MANAGE_BASEURL + _prefix + 'manageSuperUserList',param).then((res)=>{
		callback(res)
	})
}

//
export function apiMySponsoredVote (param, callback) {
	let _prefix = !MOCK ? 'VotingPreEntryServlet?act=' : ''
	get(MANAGE_BASEURL + _prefix + 'MySponsoredVoteList',param).then((res)=>{
		callback(res)
	})
}


//
export function apiMySponsoredVoteDetail (param, callback) {
	let _prefix = !MOCK ? 'VotingPreEntryServlet?act=' : ''
	get(MANAGE_BASEURL + _prefix + 'MySponsoredVoteDetail',param).then((res)=>{
		callback(res)
	})
}

//
export function apiToBeReviewVote (param, callback) {
	let _prefix = !MOCK ? 'VotingPreEntryServlet?act=' : ''
	get(MANAGE_BASEURL + _prefix + 'ToBeReviewVote',param).then((res)=>{
		callback(res)
	})
}

//赛事管理列表
export function apiToBeManageVote (param, callback) {
	let _prefix = !MOCK ? 'VotingPreEntryServlet?act=' : ''
	get(MANAGE_BASEURL + _prefix + 'ToBeManageVote',param).then((res)=>{
		callback(res)
	})
}

//我参与的赛事列表
export function apiToBeManageGame (param, callback) {
	let _prefix = !MOCK ? 'VotingPreEntryServlet?act=' : ''
	get(MANAGE_BASEURL + _prefix + 'ToBeManageGame',param).then((res)=>{
		callback(res)
	})
}



///////////////////////////////////////////////////   以下是工具方法  ////////////////////////////////////////////////////////////
///////////////////////////////////////////////////   以下是工具方法  ////////////////////////////////////////////////////////////
///////////////////////////////////////////////////   以下是工具方法  ////////////////////////////////////////////////////////////
